package com.bzkj.common.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * 对象与Map转换工具类
 */
public class ObjectMapConverter {

    // 使用Jackson的实现（推荐）
    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 使用Jackson将对象转换为Map（推荐方式）
     * @param obj 要转换的对象
     * @return 转换后的Map
     * @throws RuntimeException 如果转换失败
     */
    @SuppressWarnings("unchecked")
    public static Map<String, Object> convertToMapByJackson(Object obj) {
        try {
            return objectMapper.convertValue(obj, Map.class);
        } catch (Exception e) {
            throw new RuntimeException("对象转Map失败", e);
        }
    }

    /**
     * 使用反射将对象转换为Map
     * @param obj 要转换的对象
     * @return 转换后的Map
     * @throws RuntimeException 如果转换失败
     */
    public static Map<String, Object> convertToMapByReflection(Object obj) {
        try {
            Map<String, Object> map = new HashMap<>();
            Class<?> clazz = obj.getClass();

            for (Field field : clazz.getDeclaredFields()) {
                field.setAccessible(true);
                map.put(field.getName(), field.get(obj));
            }

            return map;
        } catch (Exception e) {
            throw new RuntimeException("对象转Map失败", e);
        }
    }

    /**
     * 自动选择最佳方式将对象转换为Map（优先使用Jackson）
     * @param obj 要转换的对象
     * @return 转换后的Map
     */
    public static Map<String, Object> toMap(Object obj) {
        try {
            // 优先使用Jackson
            return convertToMapByJackson(obj);
        } catch (Exception e) {
            // 回退到反射方式
            return convertToMapByReflection(obj);
        }
    }
}
